在網路層 (Layer 3) 中,IP 協定只負責把封包送到目的地,但它不保證封包會不會在途中遺失。為了解決這個問題,傳輸層 (Layer 4) 誕生了 TCP (傳輸控制協定)。
TCP 號稱是網路上「最可靠的快遞員」。在正式傳送任何資料之前,它會先跟伺服器進行三次確認,確保雙方都準備好接收資料了,這個經典的過程就叫做 TCP 三方交握 (Three-way Handshake)。
今天,我們將跳脫純理論,利用 Linux 內建的指令版抓包神器 tcpdump,親眼見證這三次交握的發生!
你可以把三方交握想像成打電話確認訊號的過程:
經過這三個步驟,TCP 連線才算正式建立。
為了親眼看到這三個封包,我們需要開啟兩個終端機分頁來進行「雙開」操作。
【實作練習 1:啟動監聽】
在第一個終端機分頁中,我們使用 tcpdump 監聽經過 Port 80 (HTTP 預設 Port) 的前 5 個封包:
sudo tcpdump -c 5 -i any port 80
此時終端機會進入監聽狀態,等待封包經過。
【實作練習 2:觸發連線】
開啟第二個終端機分頁,我們使用 curl 指令,對一個未加密的網頁 (example.com) 發起 HTTP 請求,藉此觸發 TCP 連線:
curl [http://example.com](http://example.com)

(畫面成功印出 example.com 的 HTML 原始碼,代表請求成功。)
這時我們切換回第一個終端機分頁,你會發現 tcpdump 已經成功抓到 5 個封包並自動停止了。我們來仔細拆解這 5 行封包的 Flags (標記) 欄位:

畫面解析:
Flags [S]:這是客戶端發出的 SYN 封包。主動向伺服器要求建立連線。Flags [S.]:這是伺服器回傳的 SYN-ACK 封包。(. 在 tcpdump 中代表 ACK)。Flags [.]:這是客戶端回傳的 ACK 封包。到這裡,三方交握正式完成!
Flags [P.]:交握完成後,客戶端正式送出帶有資料的 PSH-ACK 封包 (即圖中結尾顯示的 HTTP: GET / HTTP/1.1),開始索取網頁。Flags [.]:伺服器回傳 ACK,表示「我收到你的 GET 請求了」。今天我們不再只是死背理論,而是透過終端機的「左右互搏」,真實捕捉到了網路上最經典的 TCP 三方交握過程。無論未來你遇到多複雜的網路連線障礙、或是惡意的 DDoS SYN Flood 攻擊,核心原理都脫離不了今天我們親眼見證的這三個封包。
雖然 tcpdump 很強大,但在終端機看純文字封包實在太傷眼了!明天 [Day 10],我們終於要迎接本系列的主角——Wireshark。我們將在 Ubuntu 中安裝這套地表最強的圖形化封包分析軟體,帶你進入彩色的封包世界!我們明天見。